package nb.diskfilesystem.ui;

import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import nb.diskfilesystem.controller.FileEditorController;
import nb.diskfilesystem.model.DirectoryEntry;
import nb.diskfilesystem.util.AnimationUtil;

import java.io.IOException;

public class FileItem extends BorderPane {
    private DirectoryEntry directoryEntry; // 目录项
    private boolean isFileOpen = false; // 记录文件是否已经打开
    private FileContextMenu fileContextMenu; // 文件右键菜单

    public FileItem(DirectoryEntry directoryEntry, String cssFile, String labelText, FileContextMenu fileContextMenu, TilePane fileArea) {
        this.directoryEntry = directoryEntry;
        this.fileContextMenu = fileContextMenu;

        Pane centerPane = new Pane();
        centerPane.getStylesheets().add(getClass().getResource(cssFile).toExternalForm());
        centerPane.getStyleClass().add("pane");
        this.setCenter(centerPane);

        Label label = new Label(labelText); // 文件或文件夹名称标签
        this.setBottom(label);
        BorderPane.setAlignment(label, Pos.CENTER);

        this.getStylesheets().add(getClass().getResource("/nb/diskfilesystem/css/border.css").toExternalForm());
        this.getStyleClass().add("borderpane");
        this.setPrefSize(100, 100); // 设置FileItem的大小

        // 设置鼠标点击事件
        this.setOnMouseClicked(event -> {
            // 移除其他FileItem的选中样式
            fileArea.getChildren().forEach(node -> {
                if (node instanceof BorderPane && node != this) {
                    node.getStyleClass().remove("borderpane-selected");
                }
            });

            fileContextMenu.getBlockContextMenu().hide(); // 隐藏空白区域右键菜单

            // 添加选中样式
            if (!this.getStyleClass().contains("borderpane-selected")) {
                this.getStyleClass().add("borderpane-selected");
            }

            // 如果是右键点击，显示文件右键菜单
            if (event.getButton() == MouseButton.SECONDARY) {
                AnimationUtil.animateContextMenu(true, fileContextMenu.getFileContextMenu());
                fileContextMenu.getFileContextMenu().show(this, event.getScreenX(), event.getScreenY());
                fileContextMenu.showFileContextMenu(this, event.getScreenX(), event.getScreenY());

            }else if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { // 如果是左键点击两次
                if (!isFileOpen) { // 检查文件是否已经打开
                    System.out.println("鼠标左键双击打开文件成功");
                    try {
                        handleLeftClick();
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                } else {
                    System.out.println("文件已打开，禁止再次打开");
                }
            }
            event.consume();
        });


    }

    private void handleLeftClick() throws Exception {      //左键点击方法
        if ("file".equals(directoryEntry.getType())) { // 如果是文件
            System.out.println("判断:该内容是文件");
             openFileEditor();
        } else if ("folder".equals(directoryEntry.getType())) { // 如果是文件夹
            // 处理文件夹点击事件，例如打开文件夹内容

        }
    }

    void openFileEditor() {
        try {
            // 加载新窗口的 FXML 文件
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/nb/diskfilesystem/fxml/TextEditor.fxml"));
            System.out.println("创建fxml文件成功"+loader);
            System.out.println(getClass( ).getResource("/nb/diskfilesystem/fxml/TextEditor.fxml")+"2222");  //打印出路径

            BorderPane slideshowRoot = loader.load();//初始化完了

            //获取幻灯片控制器并初始化图片列
            FileEditorController fileEditorController = loader.getController();

            System.out.println(fileEditorController);
            System.out.println("回到MainController,开始传imageFiles");
            // 传递文件的内容到新窗口
            fileEditorController.setDirectoryEntry(directoryEntry); // 假设 DirectoryEntry 包含文件的文字（如文件名）

            // 设置文件已打开
            isFileOpen = true;

            //创建和显示幻灯片界面的窗口
            Scene scene = new Scene(slideshowRoot);
            Stage slideshowStage = new Stage();
            slideshowStage.setScene(scene);
            slideshowStage.setTitle("文件编辑");
            //创建了一个新的场景，并将加载的FXML文件的根节点设置为该场景的根节点。
            // 设置Stage的最小宽度和高度
            slideshowStage.setMinWidth(900);
            slideshowStage.setMinHeight(620);
            slideshowStage.setOnHidden(new EventHandler<WindowEvent>() {
                @Override
                public void handle(WindowEvent event) {
                    // 当窗口关闭时，重置文件打开状态
                    isFileOpen = false;
                }
            });
            slideshowStage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    // 获取目录项
    public DirectoryEntry getDirectoryEntry() {
        return directoryEntry;
    }
    public boolean getIsFileOpen(){
        return isFileOpen;
    }

    // 重命名方法
    public void rename() {
        // 创建一个新的Stage作为小窗口
        Stage renameStage = new Stage();
        renameStage.initModality(Modality.APPLICATION_MODAL); // 确保只有一个窗口是活动的
        renameStage.setTitle("重命名文件");
        // 创建一个VBox作为布局
        VBox vbox = new VBox(5); // 5是组件之间的间距
        vbox.setAlignment(Pos.CENTER);
        // 创建提示标签
        Label promptLabel = new Label("输入新的文件名：");
        vbox.getChildren().add(promptLabel);

        // 创建文本输入框，并设置默认值为文件的旧名字
        TextField nameField = new TextField(this.directoryEntry.getName());
        nameField.setPrefColumnCount(20);
        vbox.getChildren().add(nameField);
        // 设置场景和舞台
        Scene scene = new Scene(vbox, 200, 100); // 200是宽度，100是高度
        renameStage.setScene(scene);

        // 设置键盘事件，当用户按下回车键时，关闭窗口并更新文件名
        nameField.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.ENTER) {
                String newName = nameField.getText();
                if (!newName.isEmpty() && !newName.equals(this.directoryEntry.getName())) {
                    // 更新文件名
                    this.directoryEntry.setName(newName);
                    // 更新可视化界面中的文件名
                    Label label = (Label) this.lookup(".label"); // 假设文件名标签的CSS类名为"label"
                    label.setText(this.directoryEntry.getName());
                }
                renameStage.close(); // 关闭重命名窗口
            }
        });
        // 显示窗口OK
        renameStage.showAndWait(); // 等待窗口关闭
    }
}